\subsection{Regras de Boa Formação}

Para o caso do nosso compilador PHP, a análise semântica é muito restrita e uma
regra de boa formação foi identificada como podendo ser checada em tempo de
compilação. É o caso de verificar se uma variável utilizada
já foi declarada anteriormente e no escopo correto. Ou seja, verificamos de
acordo com as regras de PHP, se a ocorrência de uso de uma variável realmente
está no escopo da ocorrência de sua declaração e se essa declaração existe.

Podemos visualizar melhor esse caso no Exemplo~\ref{lst:exemploFormacao}.

\begin{lstlisting}[frame=single,
caption={Exemplo coerção},label=lst:exemploFormacao,
numbers=left, breaklines=true, language=PHP, extendedchars=true,
literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$uma_variavel;

$uma_variavel = 10;

function novo_escopo() {
    $uma_variavel = 1;
    echo $uma_variavel;
}

novo_escopo();
echo " ";
echo $uma_variavel;
?>
\end{lstlisting}

A saída para esse programa será \texttt{1 10}, dado que o escopo de
\texttt{\$uma\_variavel} usado na linha 13 é o mesmo do da declaração da linha 2
e atribuição na linha 4, enquanto o \texttt{\$uma\_variavel} usado na linha 8 é
o mesmo da sua declaração na linha 7 (já que funções/procedimentos são blocos distintos).

Um exemplo que produz saída com erro segue no
Exemplo~\ref{lst:exemploErroformacao}

\begin{lstlisting}[frame=single,
caption={Exemplo de erro para variável não
declarada},label=lst:exemploErroformacao, numbers=left, breaklines=true,
language=PHP, extendedchars=true, literate={á}{{\'a}}1 {ã}{{\~a}}1 {é}{{\'e}}1 {ç}{{\c{c}}}1 {Ç}{{\c{C}}}1 {ó}{{\'o}}1 {í}{{\'i}}1 {à}{{'a}}1 {õ}{{\~o}}1, showstringspaces=false, showspaces=false, morekeywords={}]
<?php
$uma_variavel;

function novo_escopo() {
    echo $uma_variavel;
}

novo_escopo();
?>
\end{lstlisting}

A utilização de \texttt{\$uma\_variavel} na linha 5, no \emph{nosso} compilador,
deve gerar um erro que indique a utilização indevida de uma variável ainda não
declarada (devido ao escopo da função).
